#ifndef BASE_LOG_H
#define BASE_LOG_H

#include <QObject>
#include <QString>

/**
 * @brief 日志基类
 *
 * 所有日志类型的基类，封装了系统操作日志的通用属性，
 * 包括操作人、操作时间、操作结果等核心信息，支持Qt元对象系统，
 * 可直接与QML界面绑定使用。
 */
class BaseLog : public QObject
{
    Q_OBJECT
    /**
     * @brief 日志记录ID
     * 唯一标识一条日志记录，支持QML绑定
     */
    Q_PROPERTY(int id READ get_id WRITE set_id NOTIFY id_changed)

    /**
     * @brief 操作人
     * 执行操作的用户名称，支持QML绑定
     */
    Q_PROPERTY(QString oper_user READ get_oper_user WRITE set_oper_user NOTIFY oper_user_changed)

    /**
     * @brief 操作时间
     * 操作发生的时间字符串（建议格式：yyyy-MM-dd HH:mm:ss），支持QML绑定
     */
    Q_PROPERTY(QString oper_time READ get_oper_time WRITE set_oper_time NOTIFY oper_time_changed)

    /**
     * @brief 操作结果
     * 操作执行的结果描述（如"成功"、"失败"），支持QML绑定
     */
    Q_PROPERTY(QString oper_result READ get_oper_result WRITE set_oper_result NOTIFY oper_result_changed)

public:
    /**
     * @brief 无参构造函数
     * @param parent 父对象指针，用于Qt对象树管理
     */
    explicit BaseLog(QObject *parent = nullptr)
        : QObject(parent), m_id(0) {}

    /**
     * @brief 带参构造函数
     * @param oper_user 操作人名称
     * @param oper_time 操作时间字符串
     * @param oper_result 操作结果描述
     * @param parent 父对象指针，用于Qt对象树管理
     */
    explicit BaseLog(const QString& oper_user, const QString& oper_time, const QString& oper_result,
                   QObject *parent = nullptr)
        : QObject(parent), m_id(0), m_oper_user(oper_user), m_oper_time(oper_time), m_oper_result(oper_result) {}

    // -------------------------- Getter方法 --------------------------

    /**
     * @brief 获取日志ID
     * @return 日志记录的唯一ID
     */
    int get_id() const { return m_id; }

    /**
     * @brief 获取操作人
     * @return 执行操作的用户名称
     */
    QString get_oper_user() const { return m_oper_user; }

    /**
     * @brief 获取操作时间
     * @return 操作发生的时间字符串
     */
    QString get_oper_time() const { return m_oper_time; }

    /**
     * @brief 获取操作结果
     * @return 操作执行的结果描述
     */
    QString get_oper_result() const { return m_oper_result; }

    // -------------------------- Setter方法 --------------------------

    /**
     * @brief 设置日志ID
     * @param new_id 新的日志ID值
     * @note 当新值与旧值不同时，会发射id_changed信号
     */
    void set_id(int new_id) {
        if (m_id != new_id) {
            m_id = new_id;
            emit id_changed(new_id);
        }
    }

    /**
     * @brief 设置操作人
     * @param new_oper_user 新的操作人名称
     * @note 当新值与旧值不同时，会发射oper_user_changed信号
     */
    void set_oper_user(const QString& new_oper_user) {
        if (m_oper_user != new_oper_user) {
            m_oper_user = new_oper_user;
            emit oper_user_changed(new_oper_user);
        }
    }

    /**
     * @brief 设置操作时间
     * @param new_oper_time 新的操作时间字符串
     * @note 当新值与旧值不同时，会发射oper_time_changed信号
     */
    void set_oper_time(const QString& new_oper_time) {
        if (m_oper_time != new_oper_time) {
            m_oper_time = new_oper_time;
            emit oper_time_changed(new_oper_time);
        }
    }

    /**
     * @brief 设置操作结果
     * @param new_oper_result 新的操作结果描述
     * @note 当新值与旧值不同时，会发射oper_result_changed信号
     */
    void set_oper_result(const QString& new_oper_result) {
        if (m_oper_result != new_oper_result) {
            m_oper_result = new_oper_result;
            emit oper_result_changed(new_oper_result);
        }
    }

signals:
    /**
     * @brief 日志ID变更信号
     * @param new_id 变更后的日志ID
     */
    void id_changed(int new_id);

    /**
     * @brief 操作人变更信号
     * @param new_oper_user 变更后的操作人名称
     */
    void oper_user_changed(const QString& new_oper_user);

    /**
     * @brief 操作时间变更信号
     * @param new_oper_time 变更后的操作时间字符串
     */
    void oper_time_changed(const QString& new_oper_time);

    /**
     * @brief 操作结果变更信号
     * @param new_oper_result 变更后的操作结果描述
     */
    void oper_result_changed(const QString& new_oper_result);

private:
    int m_id = 0;               // 日志记录唯一ID
    QString m_oper_user;        // 操作人名称
    QString m_oper_time;        // 操作时间（字符串格式）
    QString m_oper_result;      // 操作结果描述
};

#endif // BASE_LOG_H
